iT邦幫忙

2023 iThome 鐵人賽

DAY 14
0

今天回歸平靜,BGM:saman by Ólafur Arnalds
Yes

昨天初步了解了 Hibernate 的基礎概念,今天來探討 API 使用方法。

Hibernate SessionFactory 與 Session

在 Hibernate 中,最重要的兩個物件就是 SessionFactorySession

  • SessionFactory
    • 功能:是一個 thread safe 的物件,用來產生 Session。初始化的時候會讀取 hibernate 的 configuration,並提供與資料庫的連線,獲得 Session 物件。
    • 關鍵方法
      • openSession():打開新的 Session。
      • getCurrentSession():獲取當前的 Session。
  • Session
    • 功能:代表了一個單一的資料庫連線或是一次互動,它提供了 CRUD 操作的方法。
    • 關鍵方法
      • beginTransaction():開始一個新的 transaction。
      • save():儲存物件到資料庫。
      • update():更新物件。
      • get(), load():從資料庫讀取物件。
  • Configuration
    • 功能:用來設定 Hibernate 和資料庫的連接。
    • 關鍵方法
      • buildSessionFactory():建立 SessionFactory 物件。
  • Transaction
    • 功能:處理資料庫的 transaction。
    • 關鍵方法
      • commit():提交 transaction
      • rollback():回滾 transaction

CRUD 操作

以下是透過 Session 進行 CRUD 操作的基本範例:

1. 建立資料:

Session session = sessionFactory.openSession();
Transaction transaction = session.beginTransaction();
User user = new User("Meow", "meowmeow@example.com");
session.save(user);
transaction.commit();
session.close();

2. 讀取資料:

Session session = sessionFactory.openSession();
User user = session.get(User.class, 1L);  // 1L 是 User 的 id
session.close();

3. 更新資料:

Session session = sessionFactory.openSession();
Transaction transaction = session.beginTransaction();
User user = session.get(User.class, 1L);
user.setName("MeowMeow");
session.update(user);
transaction.commit();
session.close();

4. 刪除資料:

Session session = sessionFactory.openSession();
Transaction transaction = session.beginTransaction();
User user = session.get(User.class, 1L);
session.delete(user);
transaction.commit();
session.close();

Query API

Hibernate 提供了 HQL (Hibernate Query Language) 和 Criteria API 來進行 SQL 語句查詢:

1. HQL

Session session = sessionFactory.openSession();
Query query = session.createQuery("FROM User WHERE email = :email");
query.setParameter("email", "meow@example.com");
List<User> users = query.list();
session.close();

2. Criteria API

Session session = sessionFactory.openSession();
CriteriaBuilder builder = session.getCriteriaBuilder();
CriteriaQuery<User> query = builder.createQuery(User.class);
Root<User> root = query.from(User.class);
query.select(root).where(builder.equal(root.get("email"), "meow@example.com"));
List<User> users = session.createQuery(query).getResultList();
session.close();

Notes:

  1. 建立 SessionFactory 是個耗用時間和資源的過程,所以通常只在應用程式啟動時建立一次,並重複使用。
  2. 確保及時關閉 Session:使用完畢後,確保每個 Session 物件都有及時 close 掉,以釋放資源。
  3. 善用 Lazy Loading:有效使用延遲載入可以優化效能,但過度使用可能導致 N+1 問題

上一篇
Day 13 - Hibernate - Java Persistence
下一篇
Day 15 - JPA's 4 Lifecycle States
系列文
Spring Boot 三十天挑戰賽30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言